package genericdemo;

/**
 * <T> 占位符 代表当前类是一个泛型类
 * 1.public T[] array = new Object[10];
 *
 * 泛型的主要目的：
 *      就是指定当前的容器 要持有什么类型的对象。让编译器去做检查
 *
 * @param <T>
 */

/**
 * E 元素
 * T type
 * 泛型类<类型实参> 变量名;//定义一个泛型类引用
 * new 泛型类<类型实参>(构造方法实参）;//实例化一个泛型类对象
 * genericdemo.MyArray myArray<Integer> = new genericdemo.MyArray<Integer>();
 * genericdemo.MyArray myArray<Integer> = new genericdemo.MyArray<>();
 * @param <T>
 */

class MyArray<T>{
    //public Object[] array = new Object[10];
    public T[] array = (T[])new Object[10];//这个写法不好

    //public T[] array2 = new T[10];
    //为什么报错？
    //既然编译的时候， 把T替换成了Object那么为什么报错？
    //这里最大的问题就是数组 java的数组很特殊

    /**
     *
     * @param pos
     * @return
     */


    public T getPos(int pos){
        return array[pos];
    }

    public void setPos(int pos, T val){
        array[pos] = val;
    }

    public T[] getArray(){
        return array;
    }
}

public class TestDemo {
    public static void main(String[] args) {
        MyArray<Integer> myArray = new MyArray<>();
    }
    public static void main1(String[] args) {
        /**
         * 1.<Integer>指定当前类指定的类型是integer类型
         * 2.泛型做了两件事情
         *      存放元素的时候 进行类型的转换
         *      去元素的时候， 帮我进行类型转换
         * 3.不能使用基本的类型，尖括号里面必须是引用类型
         *      <引用类型>
         *          并且后面这个引用类型可以省略
         * genericdemo.MyArray<Integer> myArray = new genericdemo.MyArray<>();
         */
        MyArray<Integer> myArray = new MyArray<Integer>();
        myArray.setPos(0, 1);
        myArray.setPos(1, 2);
        //myArray.setPos(1,"hello");
        //每次获取元素都要强制类型转换
        Integer ret = myArray.getPos(1);
        System.out.println(ret);
        /**
         * 我们希望达到自己指定类型
         * 不强制类型转换
         * 所以我们就有了泛型
         * 泛型：可以指定类型
         */
        MyArray<String> myArray1 = new MyArray<String>();
        myArray1.setPos(0, "abv");
        myArray1.setPos(1,"abc");

        String ret2 = myArray1.getPos(0);
        System.out.println(ret2);

        //ArrayList

        //裸类型
        MyArray myArray2 = new MyArray();
        myArray2.setPos(0, 10);
        myArray2.setPos(1,"hello");

        /**
         * java的泛型是在编译的时候，擦除为Object
         */
    }
}
